#include <functional> // 包含功能库
#include <memory>     // 包含智能指针库
#include <string>     // 包含字符串库

#include "lifecycle_msgs/msg/transition_event.hpp" // 包含生命周期消息中的转换事件消息

#include "rclcpp/rclcpp.hpp" // 包含ROS 2客户端库

#include "std_msgs/msg/string.hpp" // 包含标准消息中的字符串消息

/// LifecycleListener 类作为一个简单的监听节点
/**
 * 我们订阅了两个主题：
 * - lifecycle_chatter：来自 talker 节点的数据主题
 * - lc_talker__transition_event：发布关于 lc_talker 节点状态变化通知的主题
 */
class LifecycleListener : public rclcpp::Node
{
public:
    /// LifecycleListener 构造函数
    /**
     * 构造函数，用于初始化订阅两个主题的监听节点。
     */
    explicit LifecycleListener(const std::string &node_name)
        : Node(node_name) // 初始化父类 Node
    {
        // 从 lc_talker 节点接收数据的主题
        sub_data_ = this->create_subscription<std_msgs::msg::String>(
            "lifecycle_chatter", 10, // 创建订阅者，订阅主题“lifecycle_chatter”，队列大小为10
            [this](std_msgs::msg::String::ConstSharedPtr msg)
            { return this->data_callback(msg); }); // 设置回调函数

        // 通知事件主题。所有状态变化都发布在这里，作为 TransitionEvent
        // 包含表示转换的起始状态和目标状态
        sub_notification_ = this->create_subscription<lifecycle_msgs::msg::TransitionEvent>(
            "/lc_talker/transition_event", // 订阅主题“/lc_talker/transition_event”
            10,                            // 队列大小为10
            [this](lifecycle_msgs::msg::TransitionEvent::ConstSharedPtr msg)
            {
                return this->notification_callback(msg); // 设置回调函数
            });
    }

    /// 数据回调函数
    /**
     * 处理订阅到的数据主题的消息
     */
    void data_callback(std_msgs::msg::String::ConstSharedPtr msg)
    {
        RCLCPP_INFO(get_logger(), "data_callback: %s", msg->data.c_str()); // 打印接收到的数据消息
    }

    /// 通知回调函数
    /**
     * 处理订阅到的转换事件主题的消息
     */
    void notification_callback(lifecycle_msgs::msg::TransitionEvent::ConstSharedPtr msg)
    {
        RCLCPP_INFO(
            get_logger(), "notify callback: Transition from state %s to %s", // 打印转换事件的起始状态和目标状态
            msg->start_state.label.c_str(), msg->goal_state.label.c_str());
    }

private:
    // 声明数据主题的订阅者
    std::shared_ptr<rclcpp::Subscription<std_msgs::msg::String>> sub_data_;
    // 声明通知事件主题的订阅者
    std::shared_ptr<rclcpp::Subscription<lifecycle_msgs::msg::TransitionEvent>>
        sub_notification_;
};